<!DOCTYPE html>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->


<html>
    <head>
        <meta charset="utf-8">
        <script src="lib/simpleRequire.js"></script>
        <script src="lib/config.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="stylesheet" href="lib/reset.css">
    </head>
    <body>
        <style>
        </style>
        <div id="main"></div>
        <script>

            var echarts;
            var chart;
            var myChart;

            require([
                'echarts'
            ], function (ec) {

                echarts = ec;

                var rawData = [
                    [5.1, 3.5, 1.4, 0.2, "setosa"],
                    [4.9, 3.0, 1.4, 0.2, "setosa"],
                    [4.7, 3.2, 1.3, 0.2, "setosa"],
                    [4.6, 3.1, 1.5, 0.2, "setosa"],
                    [5.0, 3.6, 1.4, 0.2, "setosa"],
                    [5.4, 3.9, 1.7, 0.4, "setosa"],
                    [4.6, 3.4, 1.4, 0.3, "setosa"],
                    [5.0, 3.4, 1.5, 0.2, "setosa"],
                    [4.4, 2.9, 1.4, 0.2, "setosa"],
                    [4.9, 3.1, 1.5, 0.1, "setosa"],
                    [5.4, 3.7, 1.5, 0.2, "setosa"],
                    [4.8, 3.4, 1.6, 0.2, "setosa"],
                    [4.8, 3.0, 1.4, 0.1, "setosa"],
                    [4.3, 3.0, 1.1, 0.1, "setosa"],
                    [5.8, 4.0, 1.2, 0.2, "setosa"],
                    [5.7, 4.4, 1.5, 0.4, "setosa"],
                    [5.4, 3.9, 1.3, 0.4, "setosa"],
                    [5.1, 3.5, 1.4, 0.3, "setosa"],
                    [5.7, 3.8, 1.7, 0.3, "setosa"],
                    [5.1, 3.8, 1.5, 0.3, "setosa"],
                    [5.4, 3.4, 1.7, 0.2, "setosa"],
                    [5.1, 3.7, 1.5, 0.4, "setosa"],
                    [4.6, 3.6, 1.0, 0.2, "setosa"],
                    [5.1, 3.3, 1.7, 0.5, "setosa"],
                    [4.8, 3.4, 1.9, 0.2, "setosa"],
                    [5.0, 3.0, 1.6, 0.2, "setosa"],
                    [5.0, 3.4, 1.6, 0.4, "setosa"],
                    [5.2, 3.5, 1.5, 0.2, "setosa"],
                    [5.2, 3.4, 1.4, 0.2, "setosa"],
                    [4.7, 3.2, 1.6, 0.2, "setosa"],
                    [4.8, 3.1, 1.6, 0.2, "setosa"],
                    [5.4, 3.4, 1.5, 0.4, "setosa"],
                    [5.2, 4.1, 1.5, 0.1, "setosa"],
                    [5.5, 4.2, 1.4, 0.2, "setosa"],
                    [4.9, 3.1, 1.5, 0.2, "setosa"],
                    [5.0, 3.2, 1.2, 0.2, "setosa"],
                    [5.5, 3.5, 1.3, 0.2, "setosa"],
                    [4.9, 3.6, 1.4, 0.1, "setosa"],
                    [4.4, 3.0, 1.3, 0.2, "setosa"],
                    [5.1, 3.4, 1.5, 0.2, "setosa"],
                    [5.0, 3.5, 1.3, 0.3, "setosa"],
                    [4.5, 2.3, 1.3, 0.3, "setosa"],
                    [4.4, 3.2, 1.3, 0.2, "setosa"],
                    [5.0, 3.5, 1.6, 0.6, "setosa"],
                    [5.1, 3.8, 1.9, 0.4, "setosa"],
                    [4.8, 3.0, 1.4, 0.3, "setosa"],
                    [5.1, 3.8, 1.6, 0.2, "setosa"],
                    [4.6, 3.2, 1.4, 0.2, "setosa"],
                    [5.3, 3.7, 1.5, 0.2, "setosa"],
                    [5.0, 3.3, 1.4, 0.2, "setosa"],
                    [7.0, 3.2, 4.7, 1.4, "versicolor"],
                    [6.4, 3.2, 4.5, 1.5, "versicolor"],
                    [6.9, 3.1, 4.9, 1.5, "versicolor"],
                    [5.5, 2.3, 4.0, 1.3, "versicolor"],
                    [6.5, 2.8, 4.6, 1.5, "versicolor"],
                    [5.7, 2.8, 4.5, 1.3, "versicolor"],
                    [6.3, 3.3, 4.7, 1.6, "versicolor"],
                    [4.9, 2.4, 3.3, 1.0, "versicolor"],
                    [6.6, 2.9, 4.6, 1.3, "versicolor"],
                    [5.2, 2.7, 3.9, 1.4, "versicolor"],
                    [5.0, 2.0, 3.5, 1.0, "versicolor"],
                    [5.9, 3.0, 4.2, 1.5, "versicolor"],
                    [6.0, 2.2, 4.0, 1.0, "versicolor"],
                    [6.1, 2.9, 4.7, 1.4, "versicolor"],
                    [5.6, 2.9, 3.6, 1.3, "versicolor"],
                    [6.7, 3.1, 4.4, 1.4, "versicolor"],
                    [5.6, 3.0, 4.5, 1.5, "versicolor"],
                    [5.8, 2.7, 4.1, 1.0, "versicolor"],
                    [6.2, 2.2, 4.5, 1.5, "versicolor"],
                    [5.6, 2.5, 3.9, 1.1, "versicolor"],
                    [5.9, 3.2, 4.8, 1.8, "versicolor"],
                    [6.1, 2.8, 4.0, 1.3, "versicolor"],
                    [6.3, 2.5, 4.9, 1.5, "versicolor"],
                    [6.1, 2.8, 4.7, 1.2, "versicolor"],
                    [6.4, 2.9, 4.3, 1.3, "versicolor"],
                    [6.6, 3.0, 4.4, 1.4, "versicolor"],
                    [6.8, 2.8, 4.8, 1.4, "versicolor"],
                    [6.7, 3.0, 5.0, 1.7, "versicolor"],
                    [6.0, 2.9, 4.5, 1.5, "versicolor"],
                    [5.7, 2.6, 3.5, 1.0, "versicolor"],
                    [5.5, 2.4, 3.8, 1.1, "versicolor"],
                    [5.5, 2.4, 3.7, 1.0, "versicolor"],
                    [5.8, 2.7, 3.9, 1.2, "versicolor"],
                    [6.0, 2.7, 5.1, 1.6, "versicolor"],
                    [5.4, 3.0, 4.5, 1.5, "versicolor"],
                    [6.0, 3.4, 4.5, 1.6, "versicolor"],
                    [6.7, 3.1, 4.7, 1.5, "versicolor"],
                    [6.3, 2.3, 4.4, 1.3, "versicolor"],
                    [5.6, 3.0, 4.1, 1.3, "versicolor"],
                    [5.5, 2.5, 4.0, 1.3, "versicolor"],
                    [5.5, 2.6, 4.4, 1.2, "versicolor"],
                    [6.1, 3.0, 4.6, 1.4, "versicolor"],
                    [5.8, 2.6, 4.0, 1.2, "versicolor"],
                    [5.0, 2.3, 3.3, 1.0, "versicolor"],
                    [5.6, 2.7, 4.2, 1.3, "versicolor"],
                    [5.7, 3.0, 4.2, 1.2, "versicolor"],
                    [5.7, 2.9, 4.2, 1.3, "versicolor"],
                    [6.2, 2.9, 4.3, 1.3, "versicolor"],
                    [5.1, 2.5, 3.0, 1.1, "versicolor"],
                    [5.7, 2.8, 4.1, 1.3, "versicolor"],
                    [6.3, 3.3, 6.0, 2.5, "virginica"],
                    [5.8, 2.7, 5.1, 1.9, "virginica"],
                    [7.1, 3.0, 5.9, 2.1, "virginica"],
                    [6.3, 2.9, 5.6, 1.8, "virginica"],
                    [6.5, 3.0, 5.8, 2.2, "virginica"],
                    [7.6, 3.0, 6.6, 2.1, "virginica"],
                    [4.9, 2.5, 4.5, 1.7, "virginica"],
                    [7.3, 2.9, 6.3, 1.8, "virginica"],
                    [6.7, 2.5, 5.8, 1.8, "virginica"],
                    [7.2, 3.6, 6.1, 2.5, "virginica"],
                    [6.5, 3.2, 5.1, 2.0, "virginica"],
                    [6.4, 2.7, 5.3, 1.9, "virginica"],
                    [6.8, 3.0, 5.5, 2.1, "virginica"],
                    [5.7, 2.5, 5.0, 2.0, "virginica"],
                    [5.8, 2.8, 5.1, 2.4, "virginica"],
                    [6.4, 3.2, 5.3, 2.3, "virginica"],
                    [6.5, 3.0, 5.5, 1.8, "virginica"],
                    [7.7, 3.8, 6.7, 2.2, "virginica"],
                    [7.7, 2.6, 6.9, 2.3, "virginica"],
                    [6.0, 2.2, 5.0, 1.5, "virginica"],
                    [6.9, 3.2, 5.7, 2.3, "virginica"],
                    [5.6, 2.8, 4.9, 2.0, "virginica"],
                    [7.7, 2.8, 6.7, 2.0, "virginica"],
                    [6.3, 2.7, 4.9, 1.8, "virginica"],
                    [6.7, 3.3, 5.7, 2.1, "virginica"],
                    [7.2, 3.2, 6.0, 1.8, "virginica"],
                    [6.2, 2.8, 4.8, 1.8, "virginica"],
                    [6.1, 3.0, 4.9, 1.8, "virginica"],
                    [6.4, 2.8, 5.6, 2.1, "virginica"],
                    [7.2, 3.0, 5.8, 1.6, "virginica"],
                    [7.4, 2.8, 6.1, 1.9, "virginica"],
                    [7.9, 3.8, 6.4, 2.0, "virginica"],
                    [6.4, 2.8, 5.6, 2.2, "virginica"],
                    [6.3, 2.8, 5.1, 1.5, "virginica"],
                    [6.1, 2.6, 5.6, 1.4, "virginica"],
                    [7.7, 3.0, 6.1, 2.3, "virginica"],
                    [6.3, 3.4, 5.6, 2.4, "virginica"],
                    [6.4, 3.1, 5.5, 1.8, "virginica"],
                    [6.0, 3.0, 4.8, 1.8, "virginica"],
                    [6.9, 3.1, 5.4, 2.1, "virginica"],
                    [6.7, 3.1, 5.6, 2.4, "virginica"],
                    [6.9, 3.1, 5.1, 2.3, "virginica"],
                    [5.8, 2.7, 5.1, 1.9, "virginica"],
                    [6.8, 3.2, 5.9, 2.3, "virginica"],
                    [6.7, 3.3, 5.7, 2.5, "virginica"],
                    [6.7, 3.0, 5.2, 2.3, "virginica"],
                    [6.3, 2.5, 5.0, 1.9, "virginica"],
                    [6.5, 3.0, 5.2, 2.0, "virginica"],
                    [6.2, 3.4, 5.4, 2.3, "virginica"],
                    [5.9, 3.0, 5.1, 1.8, "virginica"]
                ];

                var GRID_WIDTH = 220;
                var GRID_HEIGHT = 220;
                var GAP = 20;
                var CATEGORY_DIM = 4;
                var CROSS_DIM_NUMBER = 4;
                var BASE_LEFT = 30;
                var BASE_TOP = 20;
                var SYMBOL_SIZE = 8;

                function genData(data, dimX, dimY) {
                    var result = [];
                    for (var i = 0; i < data.length; i++) {
                        result.push([data[i][dimX], data[i][dimY], data[i][CATEGORY_DIM]]);
                    }
                    return result;
                }

                function getCategories(data) {
                    var map = {};
                    var result = [];
                    for (var i = 0; i < data.length; i++) {
                        if (!map[data[i][CATEGORY_DIM]]) {
                            map[data[i][CATEGORY_DIM]] = 1;
                        }
                    }
                    for (var cate in map) {
                        if (map.hasOwnProperty(cate)) {
                            result.push(cate);
                        }
                    }
                    return result;
                }

                function genGrids(option) {
                    var gridList = option.grid = [];
                    var xAxisList = option.xAxis = [];
                    var yAxisList = option.yAxis = [];
                    var seriesList = option.series = [];
                    var visualMapSeriesIndices = option.visualMap.seriesIndex = [];
                    var axisPointerLinkList = option.axisPointer.link = [];
                    var axisPointerLinkMap = {};

                    for (var i = 0; i < CROSS_DIM_NUMBER; i++) {
                        for (var j = 0; j < CROSS_DIM_NUMBER; j++) {
                            var id = i + '-' + j;

                            var linkItem = axisPointerLinkMap['x' + i];
                            if (!linkItem) {
                                linkItem = axisPointerLinkMap['x' + i] = {xAxisId: []};
                                axisPointerLinkList.push(linkItem);
                            }
                            linkItem.xAxisId.push(id);

                            var linkItem = axisPointerLinkMap['y' + j];
                            if (!linkItem) {
                                linkItem = axisPointerLinkMap['y' + j] = {yAxisId: []};
                                axisPointerLinkList.push(linkItem);
                            }
                            linkItem.yAxisId.push(id);

                            gridList.push({
                                left: BASE_LEFT + i * (GRID_WIDTH + GAP),
                                top: BASE_TOP + (CROSS_DIM_NUMBER - 1 - j) * (GRID_HEIGHT + GAP),
                                width: GRID_WIDTH,
                                height: GRID_HEIGHT,
                                outerBoundsMode: 'none'
                            });
                            xAxisList.push({
                                id: id,
                                axisLine: {
                                    onZero: false
                                },
                                axisTick: {
                                    show: j === 0
                                },
                                axisLabel: {
                                    show: j === 0
                                },
                                type: 'value',
                                gridIndex: i * CROSS_DIM_NUMBER + j,
                                scale: true
                            });
                            yAxisList.push({
                                id: id,
                                axisLine: {
                                    onZero: false
                                },
                                axisTick: {
                                    show: i === 0
                                },
                                axisLabel: {
                                    show: i === 0
                                },
                                type: 'value',
                                gridIndex: i * CROSS_DIM_NUMBER + j,
                                scale: true
                            });
                            seriesList.push({
                                type: 'scatter',
                                symbolSize: SYMBOL_SIZE,
                                xAxisIndex: i * CROSS_DIM_NUMBER + j,
                                yAxisIndex: i * CROSS_DIM_NUMBER + j,
                                data: genData(rawData, i, j)
                            });
                            visualMapSeriesIndices.push(i * CROSS_DIM_NUMBER + j);
                        }
                    }
                }

                var option = {
                    legend: {
                        data: ['scatter', 'scatter2', 'scatter3']
                    },
                    animation: false,
                    brush: {
                        brushLink: 'all'
                    },
                    axisPointer: {
                        show: true,
                        snap: true,
                        link: [],
                        lineStyle: {
                            type: 'dashed'
                        }
                    },
                    visualMap: {
                        type: 'piecewise',
                        categories: getCategories(rawData),
                        dimension: 2,
                        orient: 'horizontal',
                        top: 0,
                        left: 'center',
                        inRange: {
                            color: ['#c23531','#2f4554', '#61a0a8']
                        }
                    },
                    tooltip: {
                        trigger: 'item',
                        extraCssText: 'max-width:400px; white-space: normal;',
                        formatter: function (params) {
                            if (echarts.util.isArray(params)) {
                                var map = {
                                    x: {items: []},
                                    y: {items: []}
                                };
                                echarts.util.each(params, function (param) {
                                    var dim = param.axisDim;
                                    var mapItem = map[dim];
                                    mapItem.axisValueLabel = param.axisValueLabel;
                                    mapItem.items.push(
                                        param.value[dim === 'x' ? 1 : 0]
                                        + ' ' + param.value[2]
                                    );
                                });
                                return map.x.axisValueLabel + '<br>(' + map.x.items.join(') (') + ')'
                                    + '<br><br>'
                                    + map.y.axisValueLabel + '<br>(' + map.y.items.join(') (') + ')';
                            }
                            else {
                                return params.name + ' ' + params.value;
                            }
                        }
                    }
                };

                genGrids(option);

                var mainEl = document.getElementById('main');
                mainEl.style.height = BASE_TOP * 2 + CROSS_DIM_NUMBER * (GRID_HEIGHT + GAP) + 'px';
                chart = myChart = echarts.init(mainEl);
                chart.setOption(option);
            });

        </script>
    </body>
</html>